在前幾天的專案架構練習中,我們已經學會了模組化與檔案拆分的重要性,知道如何把資源按功能分類、建立可重用模組。今天,我們要把同樣的思維延伸到 多環境管理,讓同一套程式碼可以應用在 開發 (Dev)、測試 (Test)、正式 (Prod) 等環境,而不需要為每個環境複製整個專案。
Terraform 提供了 Workspace 功能來解決這個需求:每個 Workspace 對應一個獨立的 state,讓不同環境互不干擾,又能共用相同的程式碼和模組!
Workspace 可以想像成 Terraform 的「環境隔間」。
在同一個專案資料夾下,可以同時存在多個 Workspace,每個 Workspace 都會有自己的 state 檔:
使用 Workspace 有幾個好處:
${terraform.workspace}
可以為每個環境自動加上名稱後綴。# 查看目前 Workspace
terraform workspace list
# 建立新 Workspace
terraform workspace new <name>
# 切換 Workspace
terraform workspace select <name>
# 顯示目前 Workspace
terraform workspace show
# 刪除 Workspace
terraform workspace delete <name>
💡 小提醒:建立新的 Workspace 時,Terraform 會創建一個空白 state,確保新的環境不會看到其他環境的資源。
這邊是一個簡單的 GCP Compute Engine 範例,透過 Workspace 可以讓不同環境的 VM 自動命名:
provider "google" {
project = var.project_id
region = var.region
}
resource "google_compute_instance" "example" {
name = "web-${terraform.workspace}"
machine_type = var.machine_type
zone = var.zone
boot_disk {
initialize_params {
image = "debian-cloud/debian-12"
}
}
network_interface {
network = "default"
access_config {}
}
tags = ["${terraform.workspace}"]
}
output "instance_name" {
value = google_compute_instance.example.name
}
${terraform.workspace}
會自動套用目前 Workspace 名稱,所以部署在 dev 環境時,instance 會被命名為 web-dev。
terraform workspace new dev
Created and switched to workspace "dev"!
切換到 dev Workspace 後,我們可以使用對應的變數檔 dev.tfvars
進行 apply:
terraform apply -var-file=dev.tfvars
輸出結果:
Outputs:
instance_name = web-dev
使用 terraform show
可以確認 state,只有 Dev 環境的資源。
第一次建立 Workspace 時,Terraform 會告訴你這是一個新的空白環境,因此 apply 時只會看到該 Workspace 下的資源。
terraform workspace new test
Created and switched to workspace "test"!
同樣地,使用 Test 變數檔:
terraform apply -var-file=test.tfvars
輸出結果:
Outputs:
instance_name = web-test
切換到 Test Workspace 後,terraform show
會顯示空的 state(除非你已經 apply 過),確保 Dev 資源不受影響。
$ tree
.
├── dev.tfvars
├── test.tfvars
├── main.tf
└── terraform.tfstate.d
├── dev
│ └── terraform.tfstate
└── test
└── terraform.tfstate
每個 Workspace 都有自己的資料夾與 state 檔案,互不干擾。
目前使用的 Workspace 也會存放在 .terraform/environment
:
$ cat .terraform/environment
test
測試完畢後,我們可以刪除各 Workspace 的資源:
# 刪除 Test 環境
terraform workspace select test
terraform destroy -var-file=test.tfvars
# 刪除 Dev 環境
terraform workspace select dev
terraform destroy -var-file=dev.tfvars
💡 小提醒:Terraform destroy 也會依照 Workspace 刪除對應環境資源,不會影響其他 Workspace。
Workspace 是 Terraform 提供的一個多環境管理工具,它可以讓每個環境都有自己獨立的 state,互不干擾,這樣 Dev、Test、Prod 就不會互相搞亂。再加上 ${terraform.workspace}
這個變數,你可以自動幫每個環境的資源命名,不需要手動去改名字。搭配不同的變數檔,就能輕鬆為每個環境傳入不同設定。這個方式不只適用在 GCP,也可以用在 AWS 或 Azure,對 CI/CD 的多環境自動化部署來說,是非常方便又好用的!